package com.ruoyi.util.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSONObject;

/**
 * @Description: 使用JDK原生提供的net，无需其他jar包,HttpURLConnection是URLConnection的子类，提供更多的方法，使用更方便。
 * @ClassName: HttpURLConnectionUtil
 * @author syc
 * @date: 2022年6月3日 下午5:46:45
 */
public class HttpURLConnectionUtil {
	
	/**
	 * @Description: 发送post类型http请求
	 * @param urlStr 请求地址
	 * @param headermap 请求头
	 * @param jsonparam 参数
	 * @author syc
	 * @date: 2022年6月3日 下午4:13:55
	 */
	public static String sendPost(String urlStr, Map<String, String> headermap, JSONObject jsonparam) {
		return  sendPost(urlStr, headermap, jsonparam, "UTF-8");
	}

	/**
	 * @Description: 发送post类型http请求
	 * @param urlStr 请求地址
	 * @param headermap 请求头
	 * @param jsonparam 参数
	 * @param charset 
	 * @author syc
	 * @date: 2022年6月3日 下午4:13:55
	 */
	public static String sendPost(String urlStr, Map<String, String> headermap, JSONObject jsonparam, String charset) {
		HttpURLConnection con = null;
		BufferedReader buffer = null;
		StringBuffer resultBuffer = null;
		try {
			URL url = new URL(urlStr);
			// 得到连接对象
			con = (HttpURLConnection) url.openConnection();
			// 设置请求类型
			con.setRequestMethod("POST");
			// 设置是否使用HttpURLConnection进行输出，默认值为 false
			con.setDoOutput(true);
			// 设置是否从HttpURLConnection输入，默认值为 true
			con.setDoInput(true);
			// 不使用缓存(Post请求不能使用缓存)
			con.setUseCaches(false);
			// 设置请求需要返回的数据类型和字符集类型还是自己设置吧,这个留在这里做个参考)
			//con.setRequestProperty("Content-Type", "application/json;charset=" + charset);
			// 设置请求头
			for (String key : headermap.keySet()) {
				con.setRequestProperty(key, headermap.get(key));
			}
			// 设置body的参数
//			JSONObject param = new JSONObject();
//			param.put("name", "张三丰");
//			param.put("age", 158);
			// 建立实际的连接
			con.connect();
			// 得到请求的输出流对象 (这里就固定给utf-8了.ie弃用了,什么时候中文乱码问题可以彻底解决呀.)
			OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), charset);
			writer.write(jsonparam.toString());
			writer.flush();
			// 得到响应码
			int responseCode = con.getResponseCode();
			if (responseCode == HttpURLConnection.HTTP_OK) {
				// 得到响应流
				InputStream inputStream = con.getInputStream();
				// 将响应流转换成字符串
				resultBuffer = new StringBuffer();
				String line;
				buffer = new BufferedReader(new InputStreamReader(inputStream, charset));
				while ((line = buffer.readLine()) != null) {
					resultBuffer.append(line);
				}
				return resultBuffer.toString();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * @Description: 发送GET类型http请求
	 * @param urlStr 请求地址
	 * @param headermap 请求头
	 * @param paramMap 参数
	 * @author syc
	 * @date: 2022年6月3日 下午4:13:55
	 */
	public static String sendGet(String urlStr, Map<String, String> headermap, Map<String, String> paramMap) {
		return sendGet(urlStr, headermap, paramMap, "UTF-8");
	}

	/**
	 * @Description: 发送GET类型http请求
	 * @author syc
	 * @param urlStr 请求地址
	 * @param headermap 请求头
	 * @param paramMap 参数
	 * @param charset
	 * @date: 2022年6月3日 下午4:13:55
	 */
	public static String sendGet(String urlStr, Map<String, String> headermap, Map<String, String> paramMap,
			String charset) {
		HttpURLConnection con = null;
		BufferedReader buffer = null;
		StringBuffer resultBuffer = null;
		try {
			if (paramMap != null) {
				StringBuilder stringBuilder = new StringBuilder();
				for (String key : paramMap.keySet()) {
					String value = paramMap.get(key);
					if (StringUtils.isNotBlank(value)) {
						if (stringBuilder.length() > 0) {
							stringBuilder.append("&");
						}
						stringBuilder.append(key).append("=").append(URLEncoder.encode(value, charset));
					}
				}
				if (stringBuilder.length() > 0) {
					urlStr = urlStr + "?" + stringBuilder.toString();
				}
			}
			URL url = new URL(urlStr);
			// 得到连接对象
			con = (HttpURLConnection) url.openConnection();
			// 设置请求类型
			con.setRequestMethod("GET");
			// 设置是否使用HttpURLConnection进行输出，默认值为 false
			con.setDoOutput(true);
			// 设置是否从HttpURLConnection输入，默认值为 true
			con.setDoInput(true);
			// 不使用缓存(Post请求不能使用缓存)
			con.setUseCaches(false);
			// 设置请求需要返回的数据类型和字符集类型(还是自己设置吧,这个留在这里做个参考)
			// con.setRequestProperty("Content-Type", "application/json;charset=" +
			// charset);
			// 设置请求头
			for (String key : headermap.keySet()) {
				con.setRequestProperty(key, headermap.get(key));
			}
			// 建立实际的连接
			// con.connect();
			// 得到响应码
			int responseCode = con.getResponseCode();
			if (responseCode == HttpURLConnection.HTTP_OK) {
				// 得到响应流
				InputStream inputStream = con.getInputStream();
				// 将响应流转换成字符串
				resultBuffer = new StringBuffer();
				String line;
				buffer = new BufferedReader(new InputStreamReader(inputStream, charset));
				while ((line = buffer.readLine()) != null) {
					resultBuffer.append(line);
				}
				return resultBuffer.toString();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * @Description: 测试
	 * @author syc
	 * @date: 2022年6月3日 下午5:06:24
	 */
//	public static void main(String[] args) throws IOException {
//		String url1 = "http://192.168.1.214:9011/jgcs/testget";
//		String url2 = "http://192.168.1.214:9011/jgcs/testpost";
//		// 使用get 请求
//		Map<String, String> headermap = new HashMap<String, String>();
//		headermap.put("Content-Type", "application/json;charset=UTF-8");
//		headermap.put("tocken", "qoowefioedi2212122213e4235465870oi1l");
//		Map<String, String> paramMap = new HashMap<String, String>();
//		paramMap.put("name", "张三丰是一位道士.");
//		paramMap.put("age", "156");
//		System.out.println(sendGet(url1, headermap, paramMap));
//		// 使用 post 请求
//		JSONObject jsonparam = new JSONObject();
//		jsonparam.put("name", "张三丰是一位道士.他会太极拳,行踪神秘,多位皇帝想要见到他,但是都没有见到.");
//		jsonparam.put("age", 156);
//		System.out.println(sendPost(url2, headermap, jsonparam));
//	}

}
